<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script src="./js/lodash.js"></script>
    <script>
      // _.at(): 创建一个数组，值来自 object 的paths路径相应的值。
      const object = { a: [{ b: { c: 3 } }, 4] };
      console.log(_.at(object, ["a[0].b.c", "a[1]"]));

      // _.defaults(object, [sources]): 分配来源对象的可枚举属性到目标对象所有解析为 undefined 的属性上。
      // 来源对象从左到右应用。 一旦设置了相同属性的值，后续的将被忽略掉。
      console.log(_.defaults({ a: 1 }, { b: 2 }, { a: 3 }));

      // _.findKey(object, [predicate=_.identity]): 这个方法类似_.find 。 除了它返回最先被 predicate 判断为真值的元素 key，而不是元素本身。
      const users = {
        barney: { age: 36, active: true },
        fred: { age: 40, active: false },
        pebbles: { age: 1, active: true },
      };

      // .findKey(object, [predicate=_.identity]): 这个方法类似_.find 。 除了它返回最先被 predicate 判断为真值的元素 key，而不是元素本身。
      console.log(
        _.findKey(users, function (o) {
          return o.age < 40;
        })
      );

      console.log(
        _.setWith({}, "[0][1]", "a", Object),
        _.setWith({}, "[0][1]", "a", Array)
      );

      // _.invert(object): 创建一个object键值倒置后的对象。 如果 object 有重复的值，后面的值会覆盖前面的值。
      const object1 = { a: 1, b: 2, c: 1 };
      console.log(_.invert(object1));

      // _.invoke(object, path, [args]): 调用object对象path上的方法
      console.log(
        _.invoke({ a: [{ b: { c: [1, 2, 3, 4] } }] }, "a[0].b.c.slice", 1, 3)
      );

      // _.omit(object, [props]): 反向版_.pick; 这个方法一个对象，这个对象由忽略属性之外的object自身和继承的可枚举属性组成。
      // （注：可以理解为删除object对象的属性）。
      console.log(_.omit({ a: 1, b: "2", c: 3 }, ["a", "c"]));

      // _.pick(object, [props]): 创建一个从 object 中选中的属性的对象。
      console.log(_.pick({ a: 1, b: "2", c: 3 }, ["a", "c"]));

      // _.toPairs(object): 创建一个object对象自身可枚举属性的键值对数组。这个数组可以通过_.fromPairs撤回。
      // 如果object 是 map 或 set，返回其条目。
      function Foo() {
        this.a = 1;
        this.b = 2;
      }

      Foo.prototype.c = 3;

      _.toPairs(new Foo());
      // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
    </script>
  </body>
</html>
